import { ref } from "vue";
import { jsonToTableOptions } from "@/utils/vform.js";
import { downLoadFile } from "@/api/common";

/**
 * useFormJson解析vForm的json 返回表格列配置
 * @param {Object} formJson 表单Json
 * @param {Object} [config] 排序配置
 * @return {Object}  返回列表项
 */
export const useFormJson = (
  formJson,
  config = {
    sort: [],
    sortable: [],
  }
) => {
  const ops = jsonToTableOptions(formJson.widgetList, config);
  return ops;
};

/**
 * useFormJsonNew 可以连带插槽一同解析为表格列
 * @param {Object} formJson 表单Json
 * @param {Object} [config] 排序配置
 * @return {Object}  返回列表项
 */
export const useFormJsonNew = (
  formJson,
  config = {
    sort: [],
    sortable: [],
  }
) => {
  const ops = jsonToTableOptions(formJson.widgetList, config, true);
  return ops;
};
/**
 * useAsyncData  开发的页面基本用useAsyncData取 增删改查  导入 导出 下载 逻辑
 * 复杂的逻辑可以在页面单独写逻辑
 * @param {Object} APIS api方法 按格式传入 {query,add,del,update}
 * @param {Object} [formJson] vform表单json
 * @param {Vue} [dialogVform] 页面弹窗组件实例 一般为@components/dialogVform  也可以自己封装 但内置方法需保持一致
 * @param {Vue} [table] 页面列表组件实例 一般为@components/table  也可以自己封装 但内置方法需保持一致
 * @param {Vue} [proxy] 页面vue实例
 * @param {Function} plugEdit 补充修改逻辑
 * @param {Function} plugAdd 补充新增逻辑
 * @param {Function} reSetGetList 重置geList方法 一般不用
 * @param {Function} plugSubmit 补充提交逻辑
 * @param {Function} formatList 处理返回数据逻辑
 * @param {Object} filterForm 默认查询参数
 * @return {Object}  返回方法 {
 * @onSubmit 提交
 * @fetchData 获取数据 传给table实例
 * @handleAdd 点击新增
 * @handleEdit 点击修改
 * @getList 获取数据
 * @handleDel 点击删除
 * @dialogType 弹窗类型 add OR edit
 * @queryParams 查询参数传给searchForm
 * @form 补充填入数据
 * @handleExport 导出
 * @handleDownLoad 下载
 * }
 */
export const useAsyncData = (op) => {
  // console.log("op : " + JSON.stringify(op));
  const {
    APIS, // api方法 按格式传入 {query,add,del,update}
    formJson, // vform表单json
    dialogVform, // 页面弹窗组件实例 一般为@components/dialogVform  也可以自己封装 但内置方法需保持一致
    table, // 页面列表组件实例 一般为@components/table  也可以自己封装 但内置方法需保持一致
    proxy, // 页面vue实例
    plugEdit, // 补充修改逻辑
    plugAdd, // 补充新增逻辑
    reSetGetList, // 重置geList方法 一般不用
    plugSubmit, // 补充提交逻辑
    filterForm = {}, // 传入的默认查询参数
    formatList, // 处理返回数据逻辑
  } = op;

  const dialogType = ref("add");
  const queryParams = ref({});
  const form = ref({});
  const onSubmit = (data) => {
    let formData = data;
    if (plugSubmit) {
      formData = plugSubmit(data) || formData;
    }

    const plugForm = form.value || {};

    if (formData.id) {
      APIS.update({ ...formData, ...plugForm }).then((res) => {
        proxy.$modal.msgSuccess("修改成功");
        if (reSetGetList) {
          return reSetGetList();
        }
        getList();
      });
    } else {
      APIS.add({ ...formData, ...plugForm }).then((res) => {
        proxy.$modal.msgSuccess("新增成功");
        if (reSetGetList) {
          return reSetGetList();
        }
        getList();
      });
    }
  };
  /**
   *
   * @param {*} pageForm 分页
   * @param {*} done 结束函数
   */
  const fetchData = (pageForm, done) => {
    APIS.query({
      pageNum: pageForm.page,
      pageSize: pageForm.size,
      ...queryParams.value,
      ...filterForm,
    }).then((res) => {
      if (formatList) {
        res.rows = formatList(res.rows || res.data);
      }
      done({
        list: res.rows || res.data,
        total: res.total,
      });
    });
  };
  const handleAdd = () => {
    form.value = {};
    let defaultForm = {};
    if (plugAdd) {
      defaultForm = plugAdd() || {};
    }
    dialogType.value = "add";
    dialogVform.value.open(defaultForm, formJson);
  };
  const handleEdit = (row) => {
    dialogType.value = "edit";

    if (plugEdit) {
      row = plugEdit(row) || row;
    }
    dialogVform.value.open(row, formJson);
  };

  const getList = () => {
    table.value.refresh();
  };

  const handleDel = (row) => {
    proxy.$modal
      .confirm("是否确认删除 ？")
      .then(function () {
        return APIS.del(row);
      })
      .then(() => {
        proxy.$modal.msgSuccess("删除成功");
        if (reSetGetList) {
          return reSetGetList();
        }
        getList();
      })
      .catch(() => {});
  };
  const handleExport = () => {
    const pageForm = table.value.getPageForm();
    proxy.download(
      APIS.fullUrl || APIS.url + "export",
      {
        pageNum: pageForm.page,
        pageSize: pageForm.size,
        ...queryParams.value,
        ...filterForm,
      },
      `数据${new Date().getTime()}.xlsx`
    );
  };
  const handleDownLoad = (url, name) => {
    downLoadFile(url, name);
  };
  return {
    onSubmit,
    fetchData,
    handleAdd,
    handleEdit,
    getList,
    handleDel,
    dialogType,
    queryParams,
    form,
    handleExport,
    handleDownLoad,
  };
};
